#ifndef FAULT_HPP
#define FAULT_HPP
#include <stdint.h>
#include <stdbool.h>
#include "sdk_config.h"

#define FAULT_MAX_SURPPORT			FAULT_CLASSES_LIMIT ///> 故障个数
#define FAULT_MAX_ITEMSURPPORT	FAULT_RESOURCE_LENGTH   ///> 单个故障数据源

namespace motion
{
	class fault
	{
		private:
			static bool FaultTimerTick(void);
			static fault* mRegisterQueue[FAULT_MAX_SURPPORT];           ///>静态类变量
			static bool mFaultTickEnable;
			int8_t mRegisterQueueIndex;                   ///>类的私有变量
		protected:
			virtual bool CompareValue(bool isResume); ///>提供父类创建的
			virtual void mTicked(void);                ///>提供父类创建的
			void Unregister(void);                    ///>提供父类创建的
			uint32_t mWarningCount;
		public:
			typedef enum
			{
				FAULT_STATUS_NONE 		= 0,										///<无故障
				FAULT_STATUS_HOLD 		= 0x01000000,						///<故障保持中
				FAULT_STATUS_HAPPEND 	= 0x02000000,						///<故障已发生
				FAULT_STATUS_RESUME 	= 0x03000000,						///<故障恢复中
			}FaultStatusTPDF;																///<故障状态定义
			
			typedef enum
			{
				FAULT_COMPAREMETHOD_OR = 0,										///<或
				FAULT_COMPAREMETHOD_AND,											///<与
				FAULT_COMPAREMETHOD_BILATERAL,								///<双边
			}FaulCompareMethodTPDF;													///<各成员间条件比较方法
			
			typedef void (StatusChangeDelegate)();
			
			FaulCompareMethodTPDF FaultTrigCompareMethod;		///<触发:各成员间条件比较方法
			FaulCompareMethodTPDF FaultResumeCompareMethod;	///<恢复:各成员间条件比较方法
			bool FaultEnable;																///<故障使能
			bool LimitEnable;																///<限值使能
			bool WarningEnable;															///<报警使能
			bool WarningStatus;															///<报警状态
			FaultStatusTPDF FaultStatus;										///<故障状态
			uint8_t ResourceValueLen;												///<成员长度
			int FaultTrigValue;															///<触发阈值
			int FaultResumeValue;														///<恢复阈值
			uint32_t WarningTrigTime;												///<报警触发时间
			int LimitValue;																	///<限值
			int ResourceValue[FAULT_MAX_ITEMSURPPORT];			///<源数据
			int FreezValue[FAULT_MAX_ITEMSURPPORT];					///<故障发生时冻结数据
			
			fault(void);
			virtual ~fault();
			virtual void Reset();
	};
}

#endif
